昨天提到變數可修改性,今天來說變數為空這件事。在 Kotlin 裡面,我們可以將一個沒有給予型別定義的變數賦予 null
,如: var b = null
。
可用於限制並標示(給編譯器看)可被賦予 null
的變數。若對於未標示為可空 (Nullability) 的變數賦予 null
則 Kotlin 會在執行時報錯,部分 IDE (eg. IntelliJ) 就可以在 coding 時即時標示這裡有錯👍
另外,若對 null
值直接做運算操作 (包含取值),則 Kotlin 會在執行時間 (runtime) 報錯 (NullPointerException),標示程式欲從空值中取值運算這操作是不合法的。
說了這麼多,啊我就是要讓他可以有值又可以空值的話勒 (下面這張應該是不需要字幕了(X )
沒關係,Kotlin 懂,我們可以用 ?
加在型別後面,告訴 Kotlin 我就是要讓他痛可以為 null
var b: Int? = null;
當然,面對更複雜的資料結構或是物件屬性我們依樣可以給他 null
,然後這是後你一定會想,如果我會因為要寫型別導致不能給 null
那我不要給他型別就好啦?
答案是不行!如果我一開始就給他 null
那確實問題不大,因為 Kotlin 貼心的幫你補上了,但如果一開始就不是 null
而是事後被賦予 null
呢? 那很抱歉,還是會噴錯喔 (下方範例 c
)!
val b: Int = null // 錯誤: b 是一個 non-null 型別
var c = 2
c = null // 錯誤: c 是一個 non-null 型別
var d: Int? = null
var e: Int? = 3
e = null
那我們來挑戰一下吧!下面這是將 Nullability 套用到一個整數 (Int) 串列 (List) 的範例,那些是會在編譯階段 (compile-time) 錯的呢? (答案在文末)
val b: List<Int?> = listOf(null)
val c: List<Int> = listOf(null)
val d: List<Int>? = null
val e: List<Int>? = listOf(null)
val f: List<Int?> = null
val g: List<Int?>? = null
val h: List<Int?>? = listOf(null)
Ans. c
, e
, f